<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>插槽</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<!-- 普通插槽开始 -->
<div id="app">
    <alert-box>有bug发生</alert-box>
    <alert-box>有一个警告</alert-box>
    <!--如果没有内容就是显示插槽中的默认内容-->
    <alert-box></alert-box>
</div>

<!--
    绑定插槽, 下面是旧版本的格式 slot="name" 和 slop-scope="作用域"
    新版本:
        v-slot:default="data" data:作用域名称, default:插槽名称,这是默认插槽;  对应旧版本的 slop-scope="data"
        v-slot:name name:插槽名称                                          对应旧版本你的 slot="name"
        v-slot 可以简写为 # --> #name, #default="data"
-->

<script>
    /* 普通插槽 */
    Vue.component('alert-box', {
        template: `<div>
                        <strong>ERROR:</strong>
                        <slot>默认内容</slot>
                    </div>`,
    })

    new Vue({
        el: '#app',
        data: {}
    })
</script>
<!-- 普通插槽结束 -->

<!-- 具名插槽开始 -->
<div id="app2">
    <!--单个标签的插槽-->
    <base-layout>
        <p slot="header">标题信息</p>
        <p>主要内容1</p>
        <p>主要内容2</p>
        <p slot="footer">底部信息</p>
    </base-layout>

    <hr>

    <!--多个标签使用的插槽 使用template标签进行包裹-->
    <base-layout>
        <template slot='header'>
            <p>标题信息1</p>
            <p>标题信息2</p>
        </template>
        <p>主要内容1</p>
        <p>主要内容2</p>
        <template slot='footer'>
            <p>底部信息1</p>
            <p>底部信息2</p>
        </template>
    </base-layout>
</div>

<script>
    /* 具名插槽 */
    Vue.component('base-layout', {
        template: `
            <div>
                <header>
                    <slot name="header"></slot>
                </header>
                <main>
                    <slot></slot>
                </main>
                <footer>
                    <slot name="footer"></slot>
                </footer>
            </div>
        `,
    })
</script>
<!-- 具名插槽结束 -->

<!-- 作用域插槽开始: 父组件对子组件的内容进行加工处理 -->
<div id="app3">
    <fruit-list :list="list">
        <!-- 对子组件中的数据进行加工 -->
        <template slot-scope="slotProps">
            <strong v-if="slotProps.info.id == 2">{{slotProps.info.name}}</strong>
            <span v-else>{{slotProps.info.name}}</span>
        </template>
    </fruit-list>
</div>
<script>
    /* 下面插槽中的info是自己定义的, 在使用中使用插槽的作用域'.'可以引用 */
    Vue.component('fruit-list', {
        props: ['list'],
        template: `
            <div>
                <li :key="item.id" v-for="item in list">
                    <slot :info="item">{{item.name}}</slot>
                </li>
            </div>
        `
    })
    new Vue({
        el: '#app3',
        data: {
            list: [{
                id: 1,
                name: 'apple'
            }, {
                id: 2,
                name: 'orange'
            }, {
                id: 3,
                name: 'banana'
            }]
        }
    })
</script>
<!-- 作用域插槽结束 -->

</body>
</html>
